package com.skh.string;

/**
 * @Author skh
 * @Date 2020/3/27 11:16
 * @Desc 上升下降字符串
 */
public class SortString {
    /*
    给你一个字符串 s ，请你根据下面的算法重新构造字符串：

    从 s 中选出 最小 的字符，将它 接在 结果字符串的后面。
    从 s 剩余字符中选出 最小 的字符，且该字符比上一个添加的字符大，将它 接在 结果字符串后面。
    重复步骤 2 ，直到你没法从 s 中选择字符。
    从 s 中选出 最大 的字符，将它 接在 结果字符串的后面。
    从 s 剩余字符中选出 最大 的字符，且该字符比上一个添加的字符小，将它 接在 结果字符串后面。
    重复步骤 5 ，直到你没法从 s 中选择字符。
    重复步骤 1 到 6 ，直到 s 中所有字符都已经被选过。
    在任何一步中，如果最小或者最大字符不止一个 ，你可以选择其中任意一个，并将其添加到结果字符串。

    请你返回将 s 中字符重新排序后的 结果字符串 。

     

    示例 1：

    输入：s = "aaaabbbbcccc"
    输出："abccbaabccba"
    解释：第一轮的步骤 1，2，3 后，结果字符串为 result = "abc"
    第一轮的步骤 4，5，6 后，结果字符串为 result = "abccba"
    第一轮结束，现在 s = "aabbcc" ，我们再次回到步骤 1
    第二轮的步骤 1，2，3 后，结果字符串为 result = "abccbaabc"
    第二轮的步骤 4，5，6 后，结果字符串为 result = "abccbaabccba"
    示例 2：

    输入：s = "rat"
    输出："art"
    解释：单词 "rat" 在上述算法重排序以后变成 "art"
    示例 3：

    输入：s = "leetcode"
    输出："cdelotee"
    示例 4：

    输入：s = "ggggggg"
    输出："ggggggg"
    示例 5：

    输入：s = "spo"
    输出："ops"

     */

    /**
     *我们可以开一个长度为 26 的数组表示 26 个桶，每个桶里存放一种字母。先统计每个字母出现的次数。
     * 然后我们只要不停地扫描这里的「桶序列」——先从小到大扫，再从大到小扫，
     * 每次发现一个桶当中计数值不为 0 的时候，就把这个桶对应的字母添加到结果字符串的最后方，然后对计数值减一。
     *
     * 具体地，开一个长度为 26 的数组 h[]，作为用来计数的「桶」。
     * haveChar 的功能是在每次循环开始执行之前判断是否还有未使用的字符。
     * appendChar 的功能是检测当前位置的桶是否计数值为 0，如果不为 0 则修改目标串和计数值。
     *
     */
    public String sortString(String s) {
        int[] tong = new int[26];
        char[] chars = s.toCharArray();
        for (char c : chars) {
            tong[c-'a']++;
        }

        int n = s.length(); //用来判断是否所有字符串都已遍历完
        StringBuilder sb = new StringBuilder();
        while (n != 0) {
            for (int i = 0; i < 26; i++) {
                if (tong[i] > 0) {
                    sb.append((char)(i+'a'));
                    tong[i]--;
                    n--;
                }
            }

            for (int i = 25; i >=0; i--) {
                if (tong[i] > 0) {
                    sb.append((char)(i+'a'));
                    tong[i]--;
                    n--;
                }
            }
        }


        return sb.toString();
    }

    public static void main(String[] args) {
        SortString sortString = new SortString();
        String result = sortString.sortString("aaaabbbbcccc");
        System.out.println("result = " + result);
    }
}
